/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 * 
 *      http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package org.apache.catalina.security;

/**
 * Static class used to preload java classes when using the Java SecurityManager
 * so that the defineClassInPackage RuntimePermission does not trigger an
 * AccessControlException.
 * 
 * @author Glenn L. Nielsen
 * @author Jean-Francois Arcand
 * @version $Revision: 541991 $ $Date: 2007-05-27 22:02:36 +0800 (星期日, 27 五月
 *          2007) $
 */

public final class SecurityClassLoad {

	public static void securityClassLoad(ClassLoader loader) throws Exception {

		if (System.getSecurityManager() == null) {
			return;
		}

		loadCorePackage(loader);
		loadLoaderPackage(loader);
		loadSessionPackage(loader);
		loadUtilPackage(loader);
		loadJavaxPackage(loader);
		loadCoyotePackage(loader);
		loadHttp11Package(loader);
	}

	private final static void loadCorePackage(ClassLoader loader)
			throws Exception {
		String basePackage = "org.apache.catalina.";
		loader.loadClass(basePackage + "core.ApplicationContextFacade$1");
		loader.loadClass(basePackage
				+ "core.ApplicationDispatcher$PrivilegedForward");
		loader.loadClass(basePackage
				+ "core.ApplicationDispatcher$PrivilegedInclude");
		loader.loadClass(basePackage + "core.ContainerBase$PrivilegedAddChild");
		loader.loadClass(basePackage + "core.StandardWrapper$1");
		loader.loadClass(basePackage
				+ "core.ApplicationHttpRequest$AttributeNamesEnumerator");
	}

	private final static void loadLoaderPackage(ClassLoader loader)
			throws Exception {
		String basePackage = "org.apache.catalina.";
		loader.loadClass(basePackage
				+ "loader.WebappClassLoader$PrivilegedFindResource");
	}

	private final static void loadSessionPackage(ClassLoader loader)
			throws Exception {
		String basePackage = "org.apache.catalina.";
		loader.loadClass(basePackage + "session.StandardSession");
		loader.loadClass(basePackage + "session.StandardSession$1");
		loader.loadClass(basePackage
				+ "session.StandardManager$PrivilegedDoUnload");
	}

	private final static void loadUtilPackage(ClassLoader loader)
			throws Exception {
		String basePackage = "org.apache.catalina.";
		loader.loadClass(basePackage + "util.URL");
		loader.loadClass(basePackage + "util.Enumerator");
	}

	private final static void loadJavaxPackage(ClassLoader loader)
			throws Exception {
		loader.loadClass("javax.servlet.http.Cookie");
	}

	private final static void loadHttp11Package(ClassLoader loader)
			throws Exception {
		String basePackage = "org.apache.coyote.http11.";
		loader.loadClass(basePackage + "Http11Processor$1");
		loader.loadClass(basePackage + "InternalOutputBuffer$1");
		loader.loadClass(basePackage + "InternalOutputBuffer$2");
	}

	private final static void loadCoyotePackage(ClassLoader loader)
			throws Exception {
		String basePackage = "org.apache.catalina.connector.";
		loader.loadClass(basePackage
				+ "RequestFacade$GetAttributePrivilegedAction");
		loader.loadClass(basePackage
				+ "RequestFacade$GetParameterMapPrivilegedAction");
		loader.loadClass(basePackage
				+ "RequestFacade$GetRequestDispatcherPrivilegedAction");
		loader.loadClass(basePackage
				+ "RequestFacade$GetParameterPrivilegedAction");
		loader.loadClass(basePackage
				+ "RequestFacade$GetParameterNamesPrivilegedAction");
		loader.loadClass(basePackage
				+ "RequestFacade$GetParameterValuePrivilegedAction");
		loader.loadClass(basePackage
				+ "RequestFacade$GetCharacterEncodingPrivilegedAction");
		loader.loadClass(basePackage
				+ "RequestFacade$GetHeadersPrivilegedAction");
		loader.loadClass(basePackage
				+ "RequestFacade$GetHeaderNamesPrivilegedAction");
		loader.loadClass(basePackage
				+ "RequestFacade$GetCookiesPrivilegedAction");
		loader.loadClass(basePackage
				+ "RequestFacade$GetLocalePrivilegedAction");
		loader.loadClass(basePackage
				+ "RequestFacade$GetLocalesPrivilegedAction");
		loader.loadClass(basePackage
				+ "ResponseFacade$SetContentTypePrivilegedAction");
		loader.loadClass(basePackage
				+ "ResponseFacade$DateHeaderPrivilegedAction");
		loader.loadClass(basePackage
				+ "RequestFacade$GetSessionPrivilegedAction");
		loader.loadClass(basePackage + "ResponseFacade$1");
		loader.loadClass(basePackage + "OutputBuffer$1");
		loader.loadClass(basePackage + "CoyoteInputStream$1");
		loader.loadClass(basePackage + "CoyoteInputStream$2");
		loader.loadClass(basePackage + "CoyoteInputStream$3");
		loader.loadClass(basePackage + "CoyoteInputStream$4");
		loader.loadClass(basePackage + "CoyoteInputStream$5");
		loader.loadClass(basePackage + "InputBuffer$1");
		loader.loadClass(basePackage + "Response$1");
		loader.loadClass(basePackage + "Response$2");
		loader.loadClass(basePackage + "Response$3");
	}

}
